package com.quickcode.example.singleton;

import com.quickcode.annotation.Safe;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 通过使用枚举创建单例模式：
 * 1、最好、最安全的，由JVM保证构建方法只会执行一次；（推荐）
 * 2、保证了只会在调用的时候进行初始化，避免了“饿汉模式”中加载类耗时过长可能会导致出现问题（当构造方法中业务逻辑复杂时）。
 * Created by 张波 on 2019/10/23.
 */
@Safe
@Slf4j
public class SingletonExample5 {

    private SingletonExample5() {
        log.error("调用了构造方法创建了对象");
    }

    public enum INSTANCE_ENUM {
        INSTANCE;

        @Getter
        private SingletonExample5 singleton;

        INSTANCE_ENUM() {
            singleton = new SingletonExample5();
        }

    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 100; ++i) {
            executorService.execute(() -> {
                if(null == INSTANCE_ENUM.INSTANCE.getSingleton()) {
                    log.error("我取了个null值");
                }
            });
        }
        executorService.shutdown();
    }

}
